package controlador;


import java.io.IOException;
import java.util.ArrayList;
import vistas.Dibujar;
import vistas.MenuPrincipal;
import modelo.Juego;
import modelo.Poblacion;
import modelo.centrales.CentralElectrica;
import modelo.centrales.CentralEolica;
import modelo.centrales.CentralMineral;
import modelo.centrales.CentralNuclear;
import modelo.edificios.EdificioComercial;
import modelo.edificios.EdificioIndustrial;
import modelo.edificios.EdificioResidencial;
import modelo.excepciones.AfectoGodzillaException;
import modelo.excepciones.AfectoUnTerremotoException;
import modelo.excepciones.NoSePudoComenzarLaRedDeLineasDeTensionPorqueNoHayUnaCentralLimitrofeException;
import modelo.excepciones.NoSePudoComenzarLaRedDeTuberiasDeAguaPorqueNoHayUnPozoDeAguaLimitrofeException;
import modelo.excepciones.NoSePudoContinuarLaRedDeLineasDeTensionEnLaUbicacionDeseadaYaQueNoHayOtraLineaDeTensionLimitrofeException;
import modelo.excepciones.NoSePudoContinuarLaRedDeTuberiasDeAguaEnLaUbicacionDeseadaPorqueNoHayUnaTuberiaDeAguaLimitrofeException;
import modelo.excepciones.NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException;
import modelo.hectareas.Hectarea;
import modelo.hectareas.HectareaDeAgua;
import modelo.interfaces.ConstruibleTerrestre;
import modelo.mapa.Dimension;
import modelo.mapa.Mapa;
import modelo.mapa.Ubicacion;
import modelo.servicios.Bomberos;
import modelo.servicios.PozoDeAgua;
import modelo.servicios.RutaPavimentada;
import modelo.servicios.TuberiaDeAgua;

public class Coordinador {
	
	private Juego juego;
	private MenuPrincipal menuPrincipal;
	private Dibujar dibujar;
	
	public Juego getJuego() 
	{
		return juego;
	} 
	
	public void setJuego(Juego juego) 
	{
		this.juego = juego;
	}
	
	public MenuPrincipal getMenuPrincipal() {
		return menuPrincipal;
	}
	
	public void setMenuPrincipal(MenuPrincipal menuPrincipal)
	{
		this.menuPrincipal = menuPrincipal;
	}
	
	public Dibujar getDibujar()
	{
		return dibujar;
	}
	
	public void setDibujar(Dibujar dibujar) 
	{
		this.dibujar = dibujar;
	}

	public ConstruibleTerrestre buscarEnMapaTerrestre(Ubicacion ubicacion){
		return Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacion).obtenerConstruccionTerrestre();
	}
	public TuberiaDeAgua buscarEnMapaSubterraneo(Ubicacion ubicacion){
		return Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacion).obtenerTuberiaDeAgua();
		
	}
	public ArrayList<CentralElectrica> obtenerListaCentrales() {
		return juego.obtenerListadoCentralesElectricas();
	}
	public ArrayList<Bomberos> obtenerListaBomberos() {
		return juego.obtenerListadoDeBomberos();
	}
	public ArrayList<PozoDeAgua> obtenerListaPozos() {
		return juego.obtenerListadoDePozosDeAgua();
	}
	public ArrayList<RutaPavimentada> obtenerListaRutas() {
		return juego.obtenerListadoRutasPavimentadas();
	}

	public Hectarea getHectareaEn(Ubicacion ubicacion) {
		return Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacion);
	}
	public ArrayList<EdificioResidencial> obtenerListaEdificiosResidenciales() {
		return juego.obtenerListadoEdificiosResidenciales();
	}
	public ArrayList<EdificioComercial> obtenerListaEdificiosComerciales() {
		return juego.obtenerListadoDeEdificiosComerciales();
	}
	public ArrayList<EdificioIndustrial> obtenerListaEdificiosIndustriales() {
		return juego.obtenerListadoDeEdificiosIndustriales();
	}
	public ArrayList<CentralEolica> obtenerListaCentralesEolicas() {
		return juego.obtenerListadoCentralesEolicas();
	}
	public ArrayList<CentralMineral> obtenerListaCentralesMinerales() {
		return juego.obtenerListadoCentralesMinerales();
	}
	public ArrayList<CentralNuclear> obtenerListaCentralesNucleares() {
		return juego.obtenerListadoCentralesNucleares();
	}
	
	public ArrayList<HectareaDeAgua> obtenerListaDeHectareasDeAgua()
	{
		return juego.obtenerListaDeAgua();
	}
	
	public int obtenerCapacidadDeAlojamientoTotal()
	{
		return juego.obtenerCapacidadDeAlojamientoTotal();
	}
	
	public int obtenerCantidadDeCiudadanos()
	{
		return Poblacion.obtenerCantidadDeCiudadanos();
	}
	
	public int obtenerDinero() 
	{
		return juego.obtenerDinero();
	}
	
	public long obtenerCantidadDeTurnos()
	{
		return juego.obtenerCantidadDeTurnos();
	}
	
	public void edificarEdificioResidencial(Ubicacion ubicacion)
	{
		try
		{
			juego.edificarEdificioResidencial(ubicacion);		
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){}
	}
	
	public void edificarEdificioComercial(Ubicacion ubicacion)
	{
		try
		{
			juego.edificarEdificioComercial(ubicacion);	
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){}			
	}
	
	public void edificarEdificioIndustrial(Ubicacion ubicacion) 
	{
		try
		{
			juego.edificarEdificioIndustrial(ubicacion);
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){}				
	}
	
	public void edificarCentralEolica(Ubicacion ubicacion) 
	{
		try
		{
			juego.edificarCentralEolica(ubicacion);		
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){}		
	}
	
	public void edificarCentralMineral(Ubicacion ubicacion) 
	{
		try
		{
			juego.edificarCentralMineral(ubicacion);
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){}				
	}
	
	public void edificarCentralNuclear(Ubicacion ubicacion) 
	{
		try
		{
			juego.edificarCentralNuclear(ubicacion);
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){}				
	}
	
	public void edificarRedElectrica(Ubicacion ubicacion)
	{
		try
		{
			juego.continuarRedElectrica(ubicacion);			
		}
		catch(NoSePudoContinuarLaRedDeLineasDeTensionEnLaUbicacionDeseadaYaQueNoHayOtraLineaDeTensionLimitrofeException e2){
				try{
					juego.comenzarRedElectrica(ubicacion);
				}catch(NoSePudoComenzarLaRedDeLineasDeTensionPorqueNoHayUnaCentralLimitrofeException e){
					throw e; 
				}
		}
		
	}
	
	public void crearRutaPavimentada(Ubicacion ubicacion)
	{
		try
		{
			juego.crearRutaPavimentada(ubicacion);
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){};			
	}
	
	public void edificarBomberos(Ubicacion ubicacion)
	{
		try
		{
			juego.edificarBomberos(ubicacion);
		}
		catch(NoSePudoEdificarLaConstruccionDeseadaPorFaltaDeDineroException e){}
	}
	
	public void edificarPozoDeAgua(Ubicacion ubicacion)
	{
		juego.edificarPozoDeAgua(ubicacion);	
	}

	public void edificarTuberia(Ubicacion ubicacion) throws NoSePudoComenzarLaRedDeTuberiasDeAguaPorqueNoHayUnPozoDeAguaLimitrofeException
	{
		NoSePudoContinuarLaRedDeTuberiasDeAguaEnLaUbicacionDeseadaPorqueNoHayUnaTuberiaDeAguaLimitrofeException ExcepcionC;
		NoSePudoComenzarLaRedDeTuberiasDeAguaPorqueNoHayUnPozoDeAguaLimitrofeException ExcepcionB;
		try{
			juego.continuarRedDeAgua(ubicacion);
		}catch(NoSePudoContinuarLaRedDeTuberiasDeAguaEnLaUbicacionDeseadaPorqueNoHayUnaTuberiaDeAguaLimitrofeException e){
			ExcepcionC=e;
			try{
				juego.comenzarRedDeAgua(ubicacion);
			}catch(NoSePudoComenzarLaRedDeTuberiasDeAguaPorqueNoHayUnPozoDeAguaLimitrofeException e2){
				ExcepcionB=e2;
				throw ExcepcionB;
			
			}
		}
	}
	
	public void guardarPartida() throws IOException 
	{	
		juego.Guardar();
	}
	
	public void pasarTurno() {
		try {
			juego.pasarTurno();
			this.dibujar.actualizarDineroYPoblacio();
		} catch (AfectoGodzillaException e) {
			this.dibujar.afectoGodzilla();
		} catch (AfectoUnTerremotoException e2) {
			this.dibujar.afectoTerremoto();
		}	
		
	}
	public void dibujarMapaPrincipal() {
		this.dibujar.dibujarMapaPrincipal();		
	}
	public void actualizarMenu() {
		this.dibujar.actualizarDineroYPoblacio();		
	}

	public ArrayList<Ubicacion> getGodzillaCamino() 
	{
		return this.juego.getUltimoCaminoGodzilla();		
	}
	
	public long getTiempoTurnos()
	{
		return juego.obtenerTiempoTurnos();
	}
	
	public String getNombreJugador()
	{
		return juego.obtenerNombreJugador();
	}
	
	public int obtenerCapacidadDeTrabajo() 
	{
		return juego.obtenerCapacidadDeTrabajo();
	}
	
	public Dimension obtenerTamanioMapa()
	{
		return juego.getTamanioMapa();
	}
	
	public PozoDeAgua buscarEnMapaPozo(Ubicacion obtenerUbicacion)
	{
		return Mapa.getInstance().obtenerHectareaSegunUbicacion(obtenerUbicacion).obtenerPozoDeAgua();
	}
	
	public String getPartidas() throws IOException
	{
        return Juego.obtenerPartidas();
	}

	public void borrarElemento(Ubicacion ubicacion)
	{
		juego.quitarDeLasListas(ubicacion);		
	}
	
	public void borrarElementoSubterraneo(Ubicacion ubicacion) 
	{
		juego.borrarSubterraneo(ubicacion);		
	}
	
	public int obtenerFelicidad() {
		return juego.obtenerFelicidad();
	}
	public boolean elJuegoNoEstaPausado() {
		return !this.dibujar.estaPausado();
	}

	public void verPantallaPrincipal() {
		this.menuPrincipal.setVisible(true);
		
	}

	public boolean elJuegoNoTermino() {
		return !this.dibujar.juegoTerminado();
	}

	public Juego cargar(String verPartidaAIniciar) throws IOException {
		return Juego.Cargar(verPartidaAIniciar);
	}
}
	